package cn.unknowpupil.init.service.system;

import cn.unknowpupil.init.domain.dto.LoginUser;
import cn.unknowpupil.init.domain.dto.MenuNode;
import cn.unknowpupil.init.domain.system.SysPermission;
import cn.unknowpupil.init.domain.dto.TreeSelect;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created at 2020-11-13 by  w10g <br>
 * Initialize SysPermission  ... <br>
 * 权限表 核心业务处理接口
 *
 * @author unknowpupil
 * @since 0.0.1
 */
public interface ISysPermissionService extends IService<SysPermission> {
    /**
     * 新增
     *
     * @param sysPermission {@link SysPermission}  权限表
     * @return {@link SysPermission}
     */
    boolean create(SysPermission sysPermission);

    /**
     * 详情
     *
     * @param id {@code Long}   SysPermission ID
     * @return {@link SysPermission}
     */
    SysPermission info(Long id);

    /**
     * 删除
     *
     * @param id {@code Long}   SysPermission ID
     * @return {@link SysPermission}
     */
    boolean delete(Long id);


    /**
     * 修改
     *
     * @param sysPermission {@link SysPermission}  权限表
     * @return {@link SysPermission}
     */
    boolean update(SysPermission sysPermission);


    /**
     * 根据用户ID查询权限
     *
     * @param id 用户ID
     * @return 权限列表
     */
    Set<String> selectMenuPermsByUserId(Long id);

    /**
     * 根据用户查询系统权限列表
     *
     * @param permission 权限信息
     * @param loginUser     用户
     * @return 菜单列表
     */
    List<SysPermission> selectPermissionList(SysPermission permission,LoginUser loginUser);

    /**
     * 根据用户查询系统权限列表
     *
     * @param  loginUser 用户
     * @return 菜单列表
     */
    List<SysPermission> selectPermissionList(LoginUser loginUser);

    /**
     * 构建前端所需要下拉树结构
     *
     * @param permissions 权限列表
     * @return 下拉树结构列表
     */
    List<TreeSelect> buildPermissionTreeSelect(List<SysPermission> permissions);

    /**
     * 根据角色ID查询权限树信息
     *
     * @param roleId 角色ID
     * @return 选中权限列表
     */
    List<Long> selectPermissionListByRoleId(Long roleId);

    /**
     * 删除所有和role相关的权限
     * @param id 角色ID
     * @return
     */
    boolean deleteAllPermissionByRole(Long id);

    /**
     * 增加权限角色关联
     * @param id
     * @param permissionIds
     * @return
     */
    boolean insertRolePermission(Long id, Long[] permissionIds);

    /**
     * 统计角色是否分配了权限
     * @param id
     * @return
     */
    int countRolePermission(Long id);

    /**
     * 获取权限列表
     * @return
     */
    List<SysPermission> getPermissionList();

    /**
     * 获取权限合集
     * @param loginUser
     * @return
     */
    Map<String,Object> selectMenuTreeByUserId(LoginUser loginUser);
}
